#include "floor_sys.h"
#include "hal_tty.h"
#include "hal_motor.h"
#include "hal_tm1616.h"
#include "hal_floor.h"

uint8_t tmode_init_idle(uint16_t event) {

	g_tty_.printf("Enter Test Mode IDLE!!!\r\n");
	g_tm1616_.show_floor(g_floor_ctrl_.cur_floor_,TM_FLOOR_STOP);
	g_floor_ctrl_.floor_run_dir = MOTOR_STATE_STOP;
	g_motor_.ctrl_run(0);
	return FSM_EVENT_RUNNING;
}

uint8_t tmode_up(uint16_t event) {
	
	if(g_floor_node_.check_floor() == FLOOR_STATE_UP_LIMIT) {
		return FSM_EVENT_FINSH;
	}
	
	g_tm1616_.show_floor(g_floor_ctrl_.cur_floor_,TM_FLOOR_UP);
	g_motor_.ctrl_up();
	g_floor_ctrl_.floor_run_dir = MOTOR_STATE_UP;
	g_motor_.ctrl_run(1);
	return FSM_EVENT_RUNNING;
}

uint8_t tmode_down(uint16_t event) {
	
	if(g_floor_node_.check_floor() == FLOOR_STATE_DOWN_LIMIT) {
		return FSM_EVENT_FINSH;
	}
	
	g_tm1616_.show_floor(g_floor_ctrl_.cur_floor_,TM_FLOOR_DOWN);
	g_floor_ctrl_.floor_run_dir = MOTOR_STATE_DOWN;
	g_motor_.ctrl_down();
	g_motor_.ctrl_run(1);
	return FSM_EVENT_RUNNING;
}


fsm_table_t test_mode_table[] = {
	{FSM_EVENT_INIT,TMODE_IDLE,TMODE_IDLE,tmode_init_idle},
	{SYSTEM_EVENT_REACH,TMODE_IDLE,TMODE_IDLE,tmode_init_idle},

	{TMODE_EVENT_UP_CLICK,TMODE_IDLE,TMODE_UP_ONECE,tmode_up},
	{TMODE_EVENT_UP_DOUBLE,TMODE_IDLE,TMODE_UP_LIMIT,tmode_up},
	{TMODE_EVENT_UP_KEY_DOWN,TMODE_IDLE,TMODE_UP,tmode_up},

	{TMODE_EVENT_DOWN_CLICK,TMODE_IDLE,TMODE_DOWN_ONECE,tmode_down},
	{TMODE_EVENT_DOWN_DOUBLE,TMODE_IDLE,TMODE_DOWN_LIMIT,tmode_down},
	{TMODE_EVENT_DOWN_KEY_DOWN,TMODE_IDLE,TMODE_DOWN,tmode_down},

	{TMODE_EVENT_CLICK_ANY,TMODE_DOWN,TMODE_IDLE,tmode_init_idle},
	{TMODE_EVENT_DOWN_KEY_LIFT,TMODE_DOWN,TMODE_IDLE,tmode_init_idle},
	
	{TMODE_EVENT_CLICK_ANY,TMODE_DOWN,TMODE_IDLE,tmode_init_idle},
	{TMODE_EVENT_UP_KEY_LIFT,TMODE_UP,TMODE_IDLE,tmode_init_idle},
	
	{TMODE_EVENT_CLICK_ANY,TMODE_DOWN_ONECE,TMODE_IDLE,tmode_init_idle},
	{TMODE_EVENT_DOWN_KEY_LIFT,TMODE_DOWN_ONECE,TMODE_IDLE,tmode_init_idle},
	{TMODE_EVENT_UP_KEY_LIFT,TMODE_DOWN_ONECE,TMODE_IDLE,tmode_init_idle},
	{SYSTEM_EVENT_REACH,TMODE_DOWN_ONECE,TMODE_IDLE,tmode_init_idle},
	{SYSTEM_EVENT_DOWN_LIMIT,TMODE_DOWN_ONECE,TMODE_IDLE,tmode_init_idle},
	{FSM_EVENT_FINSH,TMODE_DOWN_ONECE,TMODE_IDLE,tmode_init_idle},

	{TMODE_EVENT_CLICK_ANY,TMODE_UP_ONECE,TMODE_IDLE,tmode_init_idle},
	{TMODE_EVENT_DOWN_KEY_LIFT,TMODE_UP_ONECE,TMODE_IDLE,tmode_init_idle},
	{TMODE_EVENT_UP_KEY_LIFT,TMODE_UP_ONECE,TMODE_IDLE,tmode_init_idle},
	{SYSTEM_EVENT_REACH,TMODE_UP_ONECE,TMODE_IDLE,tmode_init_idle},
	{SYSTEM_EVENT_UP_LIMIT,TMODE_UP_ONECE,TMODE_IDLE,tmode_init_idle},
	{FSM_EVENT_FINSH,TMODE_UP_ONECE,TMODE_IDLE,tmode_init_idle},
	
	{TMODE_EVENT_CLICK_ANY,TMODE_DOWN_LIMIT,TMODE_IDLE,tmode_init_idle},
	{TMODE_EVENT_DOWN_KEY_LIFT,TMODE_DOWN_LIMIT,TMODE_IDLE,tmode_init_idle},
	{TMODE_EVENT_UP_KEY_LIFT,TMODE_DOWN_LIMIT,TMODE_IDLE,tmode_init_idle},
	{FSM_EVENT_FINSH,TMODE_DOWN_LIMIT,TMODE_IDLE,tmode_init_idle},
	{SYSTEM_EVENT_DOWN_LIMIT,TMODE_DOWN_LIMIT,TMODE_IDLE,tmode_init_idle},
	
	{TMODE_EVENT_CLICK_ANY,TMODE_UP_LIMIT,TMODE_IDLE,tmode_init_idle},
	{TMODE_EVENT_DOWN_KEY_LIFT,TMODE_UP_LIMIT,TMODE_IDLE,tmode_init_idle},
	{TMODE_EVENT_UP_KEY_LIFT,TMODE_UP_LIMIT,TMODE_IDLE,tmode_init_idle},
	{FSM_EVENT_FINSH,TMODE_DOWN_LIMIT,TMODE_IDLE,tmode_init_idle},
	{SYSTEM_EVENT_UP_LIMIT,TMODE_DOWN_LIMIT,TMODE_IDLE,tmode_init_idle},
};

void test_fsm_init() {
	
	fsm_init(&g_floor_ctrl_.fsm_list[FSM_FLOOR_TEST_MODE],TMODE_IDLE,test_mode_table,sizeof(test_mode_table) / sizeof(fsm_table_t));
}

